from datetime import datetime
import urllib.parse
import re
import json
from urllib import request
import time
from xmlrpc.client import FastMarshaller
import pandas as pd
from db import ObjLink
from MySignals import global_ms


class Catch():
    redis = ObjLink.getRedisDB()

    def __init__(self):
        self.result = []

    def decodeHtml(self,strs):
        #解码html,返回一个整理好的字典对象,
        item = re.sub(r'\n?var hq_str_.*?','',strs).split(";")
        del item[len(item)-1]
        r = []
        for i in item:
            v = i.replace('"',"").split("=")
            t = v[1].split(",")
            del v[1]
            s = v+t
            r.append(s)
        return r



    # 测试当天抓取到的数据是否是更新的,从而判断当天是否开盘
    def testOk(self,url):
        ok = self.catchHtml(url)
        if ok:
            t = False
            for stock in self.result:
                if time.localtime().tm_mday == int(stock[31].split("-")[2]):
                    t = True
                    break
            return t
        else:
            return False

    # 抓取页面并返回整理好的列表对象
    def catchHtml(self,url):
        # ua_headers = {'Referer':'http://vip.stock.finance.sina.com.cn/','User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36'}
        # data = urllib.parse.urlencode(ua_headers)
        headers = {'Referer':'http://vip.stock.finance.sina.com.cn/','User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}  
        req = urllib.request.Request(url, headers=headers)  
        try:
            response = request.urlopen(req)
            html = response.read()
            self.result = self.decodeHtml(html.decode('GB18030'))
            return True
        except:
            return False


    def saveToRedis(self):
        for ss in self.result:
            key = ss[0]
            fskey = "fs_"+key

            #弹出
            oldss = Catch.redis.lpop(key)
            Catch.redis.lpop(fskey)

            if oldss == None:
                Catch.redis.lpush(key,json.dumps(ss[0:33],ensure_ascii=False))
                Catch.redis.lpush(fskey,json.dumps(ss[0:33],ensure_ascii=False))
            else:
                oldss = json.loads(oldss)
                #发送通知到消息订阅接口
                if(oldss[32].split(":")[2] == ss[32].split(":")[2]):
                    Catch.redis.lpush(key,json.dumps(ss[0:33],ensure_ascii=False))
                else:
                    Catch.redis.lpush(key,json.dumps(oldss,ensure_ascii=False),json.dumps(ss[0:33],ensure_ascii=False))

                if(oldss[32].split(":")[1] == ss[32].split(":")[1]):
                    #覆盖
                    Catch.redis.lpush(fskey,json.dumps(ss[0:33],ensure_ascii=False))
                else:
                    #插入
                    Catch.redis.lpush(fskey,json.dumps([oldss[4],oldss[32]],ensure_ascii=False),json.dumps(ss[0:33],ensure_ascii=False))
                    #print("本次分析页面耗时:%s秒"%(time.time()-tn))


    # 这个字符串由许多数据拼接在一起，不同含义的数据用逗号隔开了，按照程序员的思路，顺序号从0开始。
# 0：”大秦铁路”，股票名字；
# 1：”27.55″，今日开盘价；
# 2：”27.25″，昨日收盘价；
# 3：”26.91″，当前价格；
# 4：”27.55″，今日最高价；
# 5：”26.20″，今日最低价；
# 6：”26.91″，竞买价，即“买一”报价；
# 7：”26.92″，竞卖价，即“卖一”报价；
# 8：”22114263″，成交的股票数，由于股票交易以一百股为基本单位，所以在使用时，通常把该值除以一百；
# 9：”589824680″，成交金额，单位为“元”，若要以“万元”为成交金额的单位，需要把该值除以一万；
# 10：”4695″，“买一”申请4695股，即47手；
# 11：”26.91″，“买一”报价；
# 12：”57590″，“买二”
# 13：”26.90″，“买二”
# 14：”14700″，“买三”
# 15：”26.89″，“买三”
# 16：”14300″，“买四”
# 17：”26.88″，“买四”
# 18：”15100″，“买五”
# 19：”26.87″，“买五”
# 20：”3100″，“卖一”申报3100股，即31手；
# 21：”26.92″，“卖一”报价
# (22, 23), (24, 25), (26,27), (28, 29)分别为“卖二”至“卖四的情况”
# 30：”2008-01-11″，日期；
# 31：”15:05:32″，时间；
